package cn.comtom.ewbs.signature.common.utils;

import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Map;

import org.ini4j.Ini;
import org.ini4j.Profile.Section;

import com.google.common.collect.Maps;

import cn.comtom.ewbs.signature.common.vo.dto.IniFileEntity;
import cn.hutool.setting.dialect.Props;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class ConfigFileUtil {
	
	/**
	 * 创建ini文件
	 * @param filePath 文件路径
	 * @param filecontent 文件内容
	 * @return 
	 */
	public static boolean creatIniFile(String filePath, List<IniFileEntity> filecontent) {
	    File file = new File(filePath);
	    if(file.exists()){
	        return false;
	    }
	    try {
			file.createNewFile();
			Ini ini = new Ini();
			ini.load(file);

			//将文件内容保存到ini对象中
			filecontent.stream().forEach((entity)->{
			    ini.add(entity.getSection(),entity.getKey(),entity.getValue()== null ? "": entity.getValue());
			});
			//将文件内容保存到文件中
			ini.store(file);
			return true;
		} catch (Exception e) {
			e.printStackTrace();
		}
	    return false;
	}

	/**
	* 读取ini文件的内容
	* @param iniFile ini文件
	* @param fileContent ini文件中的key对应文件中的section，value对应i你文件section下的一个或多个key值
	* @return
	*/
	public static Map<String,Map<String,String>> readIniFile(File iniFile, Map<String, List<String>> fileContent) {
	    Map<String, Map<String, String>> sectionMap = null;
		try {
			Ini ini = new Ini();
			ini.load(iniFile);
			sectionMap = Maps.newHashMap();
			for(String key : fileContent.keySet()){
				Section section = ini.get(key);
			    Map<String,String> kvMap = Maps.newHashMap();
			    for (String value: fileContent.get(key)) {
			    	kvMap.put(value, section.get(value));
			    }
			    sectionMap.put(key, kvMap);
			}
		}  catch (Exception e) {
			e.printStackTrace();
		}
	    return sectionMap;
	}
	
	/**
	* 保存或更新ini文件
	* @param iniFile ini文件
	* @param updateData 更新的数据
	* @throws IOException
	*/
	public static boolean updateIniFile(String iniFilePath, Map<String,Map<String,String>> updateData) {
	    try {
	    	File iniFile = new File(iniFilePath);
	    	if(!iniFile.exists()){
	    		log.error("配置文件不存在：",iniFilePath);
		        return false;
		    }
			Ini ini = new Ini();
			ini.load(iniFile);
			Section section = null;
			Map<String,String> dataMap = null;
			for (String sect : updateData.keySet()){
			    section = ini.get(sect);
			    dataMap = updateData.get(sect);
			    for (String key : dataMap.keySet()){
			        section.put(key,dataMap.get(key) == null ? "" :
			        dataMap.get(key));
			    }
			}
			ini.store(iniFile);
			return true;
		} catch (Exception e) {
			e.printStackTrace();
		}
	    return false;
	}
	
	/**
	 * 创建conf文件
	 * @param filePath conf文件路径
	 * @param confMap conf文件内容
	 * @return
	 */
	public static boolean creatConfFile(String filePath, Map<String,String> confMap) {
		File file = new File(filePath);
	    if(file.exists()){
	        return false;
	    }
		Props prop = Props.create();
		confMap.forEach((k,v)->{
			prop.put(k, v);
		});
		prop.store(filePath);
		return true;
	}
	
	/**
	 * 读取conf文件
	 * @param filePath conf文件路径
	 * @param confMap conf文件内容
	 * @return
	 */
	public static Map<String,String> readConfFile(String filePath) {
		Props prop = Props.getProp(filePath,"utf-8");
		Map<String,String> propMap = Maps.newHashMap();
		prop.forEach((k,v)->{
			propMap.put(k.toString(), v.toString());
		});
		return propMap;
	}
	
	/**
	 * 更新conf文件
	 * @param filePath conf文件路径
	 * @param confMap conf文件内容
	 * @return
	 */
	public static boolean updateConfFile(String filePath, Map<String,String> confMap) {
		File confFile = new File(filePath);
    	if(!confFile.exists()){
    		log.error("配置文件不存在：",filePath);
	        return false;
	    }
	    Props prop = Props.getProp(filePath,"utf-8");
	    confMap.forEach((k,v)->{
	    	prop.put(k, v);
		});
		prop.store(filePath);
		return true;
	}
	
	public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException, IOException {
	    /*Map<String,List<String>> fileContent = new HashMap<>();
	    fileContent.put("LOGGER",Lists.newArrayList("logsw","logPath"));
	    fileContent.put("GLOBAL",Lists.newArrayList("worktype"));
	    fileContent.put("HOST 1",Lists.newArrayList("hsmModel"));
	    Map<String,Map<String,String>> fileVo = Ini4jUtils.readIniFile(file,fileContent);
	    System.out.println(fileVo);*/
		 //修改
	    /*Map<String,Map<String,String>> updateData = new HashMap<>();
	    Map<String,String> ldap = new
	    HashMap<>();
	    ldap.put("host","117.180.222.12");
	    updateData.put("HOST 1",ldap);
	    Ini4jUtils.updateIniFile(file,updateData);*/
		
		String confPath = "E:\\pj\\springboot-h2-demo\\so\\shm1814\\srj1401Hsm.conf";
		/*Map<String, String> newHashMap = Maps.newHashMap();
		newHashMap.put("ipAddrOfCenterSecuSvr", "127.0.0.1");
		updateConfFile(confPath, newHashMap);*/
		Map<String, String> readConfFile = readConfFile(confPath);
		System.out.println(readConfFile);
	}
}
